import json

from mg_app_framework import get_logger
from common.basic_redis import build_mg_redis_key, get_redis_conn
from common.constant import WorkOrderConfig

__all__ = [
    "get_work_order_config",
]


async def get_work_order_config(device_code: str) -> WorkOrderConfig:
    """
    获取指定设备的工单配置信息。

    :param device_code: 设备编码
    :return: 解析后的工单配置信息对象
    :raises ValueError: 当设备工单配置为空或解析失败时抛出异常
    """
    redis_handel = get_redis_conn()
    rd_work_order_cfg_key = build_mg_redis_key(device_code, "workorder_mgm")
    work_order_config = await fetch_work_order_from_redis(
        redis_handel, rd_work_order_cfg_key, device_code
    )
    try:
        return WorkOrderConfig(**work_order_config)
    except Exception as e:
        get_logger().error(
            f"设备:{device_code}对应的工单配置异常, 无法解析! 异常工单:{work_order_config}, error:{str(e)}"
        )
        raise ValueError(f"设备:{device_code}对应的工单配置异常, 无法解析!")


async def fetch_work_order_from_redis(redis_handel, key: str, device_code: str) -> dict:
    """
    从 Redis 中获取指定设备的工单配置信息。

    :param redis_handel: Redis 连接对象
    :param key: Redis 键
    :param device_code: 设备编码
    :return: Redis 中的工单配置字典
    :raises ValueError: 当 Redis 中未找到工单配置信息时抛出异常
    """
    work_order_config = await redis_handel.get(key)
    if not work_order_config:
        get_logger().error(f"设备:{device_code}对应的工单配置为空!")
        raise ValueError(f"设备:{device_code}对应的工单配置为空!")
    if isinstance(work_order_config, str):
        work_order_config = json.loads(work_order_config)
    return work_order_config
